#include<fuquOS/idt.h>
#include<fuquOS/gdt.h>
#include<fuquOS/printk.h>
#include<fuquOS/idt_table.h>
#include<fuquOS/kernel_conf.h>
#include<fuquOS/io.h>
#include<fuquOS/pit.h>

#define IDT_SIZE 256

struct idt_entry idt[IDT_SIZE];
struct idt_pointer idt_ptr;

extern void load_idt();

void set_idt_entry(int index,u32 base,u16 selector,u8 type){
	idt[index].offset_low=base&0xffff;
	idt[index].selector=selector;
	idt[index].zero=0;
	idt[index].type_attr=type;
	idt[index].offset_high=(base>>16)&0xffff;
}

// 初始化PIC（可编程中断控制器）
void pic_init() {
    // ICW1: 初始化PIC
    outb(0x20, 0x11);  // 主PIC
    outb(0xA0, 0x11);  // 从PIC
    
    // ICW2: 设置中断向量偏移
    outb(0x21, 0x20);  // 主PIC的中断号从0x20(32)开始
    outb(0xA1, 0x28);  // 从PIC的中断号从0x28(40)开始
    
    // ICW3: 设置主/从连接
    outb(0x21, 0x04);  // 告诉主PIC，从PIC连接到IRQ2
    outb(0xA1, 0x02);  // 告诉从PIC它的级联标识
    
    // ICW4: 设置模式
    outb(0x21, 0x01);  // 8086/88模式
    outb(0xA1, 0x01);  // 8086/88模式
    
    // 屏蔽所有中断，除了时钟中断(IRQ0)
    outb(0x21, 0xFE);  // 11111110 - 只允许IRQ0
    outb(0xA1, 0xFF);  // 11111111 - 屏蔽所有从PIC中断
}

void idt_init(){
	idt_ptr.limit=sizeof(idt)-1;
	idt_ptr.base=(u32)&idt;

	#ifdef ENABLE_ISR_REGISTRATION
		notify_registration_isr();
	#endif

	// 初始化PIC
	pic_init();
	
	// 初始化PIT
	pit_init();

	// 加载IDT
	load_idt();
	
	// 启用中断
	asm volatile("sti");
	
	printk("IDT initialized, interrupts enabled\n");
}
